<?php
/**
* 名称：xheditor上传响应控制器。
* 描述：响应xheditor编辑器的上传文件响应，针对请求类型进行处理，该类依赖基于xlibrary库上的upload类构建。
*/
final class XheditorUploader{
    /**
    * 描述：上传类别字面量值，针对xheditor的功能建立的。
    */
    const UPLOAD_TYPE_IMAGE='image';
    const UPLOAD_TYPE_DOCUMENT='document';
    const UPLOAD_TYPE_FLASH='flash';
    const UPLOAD_TYPE_VADIO='vadio';

    /**
    * 描述：每个上传类别允许的扩展名。
    */
    private $ExpandedName=array(
        self::UPLOAD_TYPE_IMAGE=>array('jpg','jpeg','gif','png'),
        self::UPLOAD_TYPE_DOCUMENT=>array('zip,rar,txt'),
        self::UPLOAD_TYPE_FLASH=>array('swf'),
        self::UPLOAD_TYPE_VADIO=>array('avi','mp4')
    );

    /**
    * 描述：每个上传类别允许文件的大小。
    */
    private $Size=array(
        self::UPLOAD_TYPE_IMAGE=>1048576,    //1M
        self::UPLOAD_TYPE_DOCUMENT=>1048576, //1M
        self::UPLOAD_TYPE_FLASH=>5242880,    //5M
        self::UPLOAD_TYPE_VADIO=>10485760    //10M
    );

    /**
    * 描述：每个上传类别存放文件的子文件夹名称。
    */
    private $Folder=array(
        self::UPLOAD_TYPE_IMAGE=>'image',
        self::UPLOAD_TYPE_DOCUMENT=>'document',
        self::UPLOAD_TYPE_FLASH=>'flash',
        self::UPLOAD_TYPE_VADIO=>'vadio'
    );

    /**
    * 描述：错误信息存储量。
    */
    private $Error=NULL;

    /**
    * 描述：在"类别文件夹"下"动态创建的文件夹名称"，根据当前日期命名。
    */
    private $DynamicFolderName=NULL;

    /**
    * 描述：文件域名称。
    */
    public $FileControlName=NULL;

    /**
    * 描述：当前上传类别。
    */
    public $UploadType=NULL;

    /**
    * 描述：上传路径。
    */
    public $UpoadPath=NULL;

    /**
    * 描述：网址显示路径。
    */
    public $URIPath=NULL;

    /**
    * 描述：控制器入口函数。
    * @param  string require $type 请求控制器的操作符
    * @return void
    */
    public function __Construct($type=NULL,$path=NULL,$fileControlName=NULL){
        $this->UploadType=$type;
        $this->Path=$path;
        $this->FileControlName=$fileControlName;
    }

    /**
    * 描述：返回错误信息。
    * @return array
    */
    public function Error(){
        return $this->Error;
    }

    /**
    * 描述：文件上传函数。
    * @return void
    */
    public function Upload(){
        if(isset($this->UpoadPath)){
            if(!is_dir($this->UpoadPath)){
                $this->Error=array('err'=>'文件上传失败，上传目录不存在。','msg'=>'');
            }
        }
        else{
            $this->Error=array('err'=>'文件上传失败，请设置上传目录。','msg'=>'');
        }
        #根据控制器操作符，初始化上传参数。
        if(in_array($this->UploadType,array(self::UPLOAD_TYPE_IMAGE,self::UPLOAD_TYPE_DOCUMENT,self::UPLOAD_TYPE_FLASH,self::UPLOAD_TYPE_VADIO))){
            $this->DynamicFolderName=date('Ymj');
            $this->UploadTypeFolderName=$this->Folder[$this->UploadType];
        }
        else{
            $this->Error=array('err'=>'文件上传失败，上传类型错误。','msg'=>'');
            return;
        }
        #获取上传文件对象,filedata是xheditor上传表单文件域的统一名称。
        if(isset($_FILES[$this->FileControlName])){
            $fileObject=$_FILES[$this->FileControlName];
        }
        else{
            $this->Error=array('err'=>'文件上传失败，找不到文件域：'.$this->FileControlName.'。','msg'=>'');
            return;
        }
        #正式上传前检测。
        $result=Upload::Probe(
            $fileObject,
            $this->GetSizeByType(),        //根据"请求上传类别",获取该类别"指定的文件大小",作为上传参数。
            $this->GetExpandedNameByType() //根据"请求上传类别",获取该类别"指定的文件扩展名",作为上传参数。
        );
        #根据检测结果，开始上传逻辑。
        if($result['error']!=UPLOAD_ERR_NO_FILE){
            switch($result['error']){
                //上传成功。
                case UPLOAD_ERR_OK:
                    $uploadPath=$this->MakeUploadPath($this->UploadType);
                    $showPath=$this->MakeShowPath(Upload::Execute($_FILES[$this->FileControlName],$uploadPath));
                    $this->Error=array('err'=>0,'msg'=>$showPath);
                break;
                //扩展名不正确。
                case Upload::UPLOAD_ERR_CUSTOM_EXT:
                    $this->Error=array('err'=>'文件格式不正确，只能是：'.join(',',$this->GetExpandedNameByType()).'。','msg'=>'');
                break;
                //文件大小不正确。
                case Upload::UPLOAD_ERR_CUSTOM_SIZE:
                    $this->Error=array('err'=>'文件大小超过了限制，不能超过：'.Upload::SizeFormat($this->GetSizeByType()).'。','msg'=>'');
                break;
                //其它上传错误，是PHP级别的上传错误。
                default :
                    $this->Error=array('err'=>'文件上传失败。错误代码：'.$result['error'].'，错误描述：'.$result['message'].'。','msg'=>'');
            }
        }
    }

    /**
    * 描述：生成上传路径。
    * @return string
    */
    private function MakeUploadPath(){
        Folder::Create($path=$this->UpoadPath.'/'.$this->UploadTypeFolderName.'/'.$this->DynamicFolderName);
        return $path;
    }

    /**
    * 描述：生成WWW显示路径，相对于网站架设根目录。
    * @param  string require $fileName 文件名
    * @return string
    */
    private function MakeShowPath($fileName){
        return $this->URIPath.'/'.$this->UploadTypeFolderName.'/'.$this->DynamicFolderName.'/'.$fileName;
    }

    /**
    * 描述：根据上传类别返回该类别允许上传的扩展名。
    * @return array
    */
    private function GetExpandedNameByType(){
        return $this->ExpandedName[$this->UploadType];
    }

    /**
    * 描述：根据上传类别返回该类别允许上传文件的大小。
    * @return number
    */
    private function GetSizeByType(){
        return $this->Size[$this->UploadType];
    }
}
?>